package com.itheima.stock.controller;

import com.itheima.stock.common.domain.InnerMarketDomain;
import com.itheima.stock.pojo.StockBusiness;
import com.itheima.stock.pojo.WeekInfo;
import com.itheima.stock.service.StockService;
import com.itheima.stock.vo.resp.PageResult;
import com.itheima.stock.vo.resp.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * @author by itheima
 * @Date 2022/1/8
 * @Description 定义操纵股票接口控制器
 */
@RestController
@RequestMapping("/api/quot")
public class StockController {

    @Autowired
    private StockService stockService;

    @GetMapping("/stockBusiness")
    public R<List<StockBusiness>> findAllBusiness(){
        return stockService.findAllBusiness();
    }

    /**
     * 获取国内大盘的实时数据
     * @return
     */
    @GetMapping("/index/all")
    public R<List<InnerMarketDomain>> innerIndexAll(){
        return stockService.innerIndexAll();
    }

    /**
     *需求说明: 沪深两市板块分时行情数据查询，以交易时间和交易总金额降序查询，取前10条数据
     * @return
     */
    @GetMapping("/sector/all")
    public R<List<Map>> sectorAll(){
        return stockService.sectorAllLimit();
    }

    /**
     * 沪深两市个股涨幅分时行情数据查询，以时间顺序和涨幅查询前10条数据
     * @return
     */
    @GetMapping("/stock/increase")
    public R<List<Map>> stockIncreaseLimit(){
        return stockService.stockIncreaseLimit();
    }

    /**
     * 沪深两市个股行情列表查询 ,以时间顺序和涨幅分页查询
     * @param page 当前页
     * @param pageSize 每页大小
     * @return
     */
    @GetMapping("/stock/all")
    public R<PageResult<Map>> stockPage(Integer page,Integer pageSize){
        return stockService.stockPage(page, pageSize);
    }

    /**
     * 功能描述：沪深两市涨跌停分时行情数据查询，查询T日每分钟的涨跌停数据（T：当前股票交易日）
     * 		查询每分钟的涨停和跌停的数据的同级；
     * 		如果不在股票的交易日内，那么就统计最近的股票交易下的数据
     * 	 map:
     * 	    upList:涨停数据统计
     * 	    downList:跌停数据统计
     * @return
     */
    @GetMapping("/stock/updown/count")
    public R<Map> upDownCount(){
        return stockService.upDownCount();
    }

    /**
     * 将指定页的股票数据导出到excel表下
     * @param response
     * @param page  当前页
     * @param pageSize 每页大小
     */
    @GetMapping("/stock/export")
    public void stockExport(HttpServletResponse response,Integer page,Integer pageSize){
         stockService.stockExport(response,page,pageSize);
    }

    /**
     * 功能描述：统计国内A股大盘T日和T-1日成交量对比功能（成交量为沪市和深市成交量之和）
     *   map结构示例：
     *      {
     *         "volList": [{"count": 3926392,"time": "202112310930"},......],
     *       "yesVolList":[{"count": 3926392,"time": "202112310930"},......]
     *      }
     * @return
     */
    @GetMapping("/stock/tradevol")
    public R<Map> stockTradeVol4InnerMarket(){
        return stockService.stockTradeVol4InnerMarket();
    }

    /**
     * 功能描述：统计在当前时间下（精确到分钟），股票在各个涨跌区间的数量
     *  如果当前不在股票有效时间内，则以最近的一个有效股票交易时间作为查询时间点；
     * @return
     *  响应数据格式：
     *  {
     *     "code": 1,
     *     "data": {
     *         "time": "2021-12-31 14:58:00",
     *         "infos": [
     *             {
     *                 "count": 17,
     *                 "title": "-3~0%"
     *             },
     *             //...
     *             ]
     *     }
     */
    @GetMapping("/stock/updown")
    public R<Map> stockUpDownScopeCount(){
        return stockService.stockUpDownScopeCount();
    }

    /**
     * 功能描述：查询单个个股的分时行情数据，也就是统计指定股票T日每分钟的交易数据；
     *         如果当前日期不在有效时间内，则以最近的一个股票交易时间作为查询时间点
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/screen/time-sharing")
    public R<List<Map>> stockScreenTimeSharing(String code){
        return stockService.stockScreenTimeSharing(code);
    }

    /**
     * 功能描述：单个个股日K数据查询 ，可以根据时间区间查询数日的K线数据
     * 		默认查询历史20天的数据；
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/screen/dkline")
    public R<List<Map>> stockCreenDkLine(String code){
        return stockService.stockCreenDkLine(code);
    }

    /**
     * 外盘指数
     * 外盘指数行情数据查询 根据时间取前4
     * @return
     */
    @GetMapping("/external/index")
    public R<List<Map>> getExternalIndex(){
        return stockService.getExternalIndex();
    }

    /**
     * 个股主营业务接口查询
     * @param stockCode
     * @return
     */
    @RequestMapping("/stock/describe")
    public R<Map> getStockDescribe(@RequestParam("code") String stockCode){
        //根据股票编号获取所对公司的详情信息
        return stockService.getStockDescribe(stockCode);
    }

    /**
     * 根据输入的个股代码，进行模糊查询，返回证券代码和证券名称
     * @param searchStr 个股代码模糊搜索
     * @return
     */
    @GetMapping("/stock/search")
    public R<List<Map>> searchStock(String searchStr){
        return stockService.searchStock(searchStr);
    }


    /**
     * 获取个股最新分时行情数据，包含开盘价、前收盘价、最新价、最高价、最低价、成交金额和成交量信息
     * @param stockCode 股票编码
     * @return
     */
    @RequestMapping("/stock/screen/second/detail")
    public R<Map> getStockSecondDetail(@RequestParam("code") String stockCode){
        return stockService.getStockSecondDetail(stockCode);
    }


    /**
     * 获取个股实时交易流水信息，按照时间降序排序，取前10
     * 单个个股秒级行情数据查询，查询当前分钟内的秒级数据（我们当前以分钟为单位获取数据）
     * @param code 股票编码
     * @return
     */
    @GetMapping("/stock/screen/second")
    public R<List<Map>> getStockScreenSecond(String code){
        return stockService.getStockScreenSecond(code);
    }

    /**
     * 单个个股周K线数据：包含股票ID 最高价 最低价 开盘价 收盘价 均价
     * 具体：最高和最低是一周内的
     *      开盘与收盘分别对应周1的开盘价格和周五的收盘价格
     *      均价就是一周的平均价格
     *      日期：一周内的最大日期，一般是周五
     * @param stockCode 股票编码
     */
    @RequestMapping("/stock/screen/weekkline")
    public R<List<WeekInfo>> getWeekKLinData(@RequestParam("code") String stockCode){
        return stockService.getWeekKLinData(stockCode);
    }



}
